篇首语:本文由编程笔记#小编为大家整理,主要介绍了elk笔记13--Queries-full text queries相关的知识,希望对你有一定的参考价值。
全文查询允许用户查询被解析后的text(分词)字段,例如邮件的正文。全文检索时候,查询字符串会按照写入时候的解析方式来解析为单个的数据项。
全文查询包括如下9类:
该查询基于匹配项的顺序和距离返回文档。
intervals 使用多个匹配规则,并将这些规则应用到特定字段的数据项中。
这些规则由一系列定义组成。这些定义产生了跨越数据项的最小intervals序列。这些intervals 可以进一步被父资源组合、过滤。
该查询顶层参数为 field,子参数包括 match、any_of、all_of、filter 四种规则,每种规则又可以包含很多其它参数,并且可以嵌套使用。
以下案例为intervals查询,其规则为all_of, 它能够查询到my_text字段中包含 "my favorite food immediately ",且其后面包含 “hot water” 或 "cold porridge “的文档。
该案例不能匹配到"when it’s cold my favorite food is porridge”, 因为all_of 的 ordered 属性为true,即第二层 intervals中的match和any_of是由先后顺序的。
POST _search
"query":
"intervals" :
"my_text" :
"all_of" :
"ordered" : true,
"intervals" : [
"match" :
"query" : "my favorite food",
"max_gaps" : 0,
"ordered" : true
,
"any_of" :
"intervals" : [
"match" : "query" : "hot water" ,
"match" : "query" : "cold porridge"
]
]
match 查询返回匹配到指定 text, number, date or boolean value 的文;其中指定的text会先被分析,然后再参加匹配.该查询是执行全文检索的标准查询,包括选择模糊匹配。
该查询顶层参数为field,子参数包括query 和 很多其它可选择参数。
GET /_search
"query":
"match" :
"message" :
"query" : "this is a test"
match 查询也可以将field 和 查询参数结合在一起,从而简化查询语法:
GET /_search
"query":
"match" :
"message" : "this is a test"
match 查询最终会被转化为bool类型的查询,其查询的string会被解析,并构建成多个terms 查询,多个查询直接默认是or关系,该关系可以通过operator 来设置。
match_bool_prefix query 查询会分析其输入,并根据input中的terms构建一个bool 查询。其中最后一个term被用来做为prefix查询,其它的每个term都会单独构建一个term查询。
其顶层参数为field,子参数包括query 和 analyzer(可省略), analyzer 默认和 index 时候的analyzer相同。
GET /_search
"query":
"match_bool_prefix" :
"message" : "quick brown f"
此处message字段中的 "quick brown f" 将被分解为 quick,brown,f 等3个terms,其中quick 和 brown 被用来构建2个terms 查询,f被用来构建一个prefix 查询,构建的查询如下:
GET /_search
"query":
"bool" :
"should": [
"term": "message": "quick" ,
"term": "message": "brown" ,
"prefix": "message": "f"
]
该查询和match_phrase_prefix 重要不同之处在于:match_phrase_prefix 匹配各个terms为一个短语(存在顺序), 但是match_bool_prefix query 可以在任何位置匹配其terms。
因此,该查询可以匹配到 quick brown fox、brown fox quick、quick、brown、以f开头的term,并且以上匹配的项可以存在于任何位置。
该查询会分析 text,并基于分析的text创建短语查询。
GET /_search
"query":
"match_phrase" :
"message" : "this is a test"
或者
GET /_search
"query":
"match_phrase" :
"message" :
"query" : "this is a test",
"analyzer" : "特定的分词器", # 可选参数
"zero_terms_query": "none" # 可选参数
该查询返回包含特定短语(前缀)的文档,其中query的string中最后一个项表示前缀信息。
其顶层参数field,子参数包括 query、analyzer、max_expansions、slop 和 zero_terms_query。
以下案例将会匹配到包含 quick brown fox 或 two quick brown ferrets的文档,但是不会匹配到 the fox is quick and brown,因为该查询中的query 的字符串是一个整体。
GET /_search
"query":
"match_phrase_prefix" :
"message" :
"query" : "quick brown f"
除了基本查询外,该查询可以用来实现输入补全。
multi_match 查询基于match查询来构建查询,并允许多个字段参与查询,其中field字段值可以用一些基础的通配符,例如 *_name。
其顶层参数包括 query、fields、type和tie_breaker;
type 有best_fields、most_fields、cross_fields、phrase、phrase_prefix、bool_prefix 几个可选值,每个值都定义来一种不同的查询方法。
GET /_search
"query":
"multi_match" :
"query": "this is a test",
"fields": [ "subject", "message" ]
common terms query 是一个使用停用符(stopwords)不错选择,通过考虑停用符来提高准确度和召回率,且不用牺牲查询性能。
问题起源:
在一个查询中,每个数据项都有一个代价,“The brown fox” 需要3个term类型的查询, 且每个查询都会基于索引中所有的文档执行查询。然而the的频率很高,可能会匹配到很多文档,因此它的向比另外2个terms的影响低。
早起解决方案为:忽略高频的terms, 把the 视作停用次,从而能减少索引大小,并且能减少需要执行的terms类型查询任务。
但实际上,停用此影响虽然很小,但是有时候也很重要。如果去掉停用此,将会降低准确率,并且不能区分 “happy” 和 "not happy"之类的查询,还会失去回召率(无法搜索到 “The The” or “To be or not to be” 之类的查询).
解决方法:
common terms query 把 query terms 分为2组: 更加重要的 (低频数据项) 和 不太重要的 (高频数据项,包括之前的停用词).
第一阶段搜索更加重要类型的数据项,这些数据项出现在少数文档中,对相关度的影响更大。
第二阶段搜索不太重要类型的数据项,这些数据项出现的频率高,对相关度的影响更加低。但是该阶段并不计算所有匹配文档的score,只计算出现在第一阶段文档中匹配文档的score。通过这种方式,高频词可以提高相关度计算,单不会导致低性能。
当一个query只包括高频数据项,那么所有的单个查询都会以 AND 的方式执行。此种情况下,可以通过设置 minimum_should_match 使多个term查询以 OR 的方式执行。
common terms query 可以通过 cutoff_frequency 参数将 terms 划分到高频或低频组中,其值可以通过绝对频率(>=1) 或者相对频率(0.0 … 1.0) 来指定。 (需要记住:文档频率是基于单个shard级别计算出来的,因为数据量足够大的时候单个shard的频率即可代表全局频率,具体原因已经在 Relevance is broken 中解释了)。
该查询最有趣的属性是其可以自动适应特定领域的停用词。例如,在视频相关的站点,用户不需要手动维护一个list,clip 和video会自动被视为停用词,
在以下案例中,数据项的文档频率大于 0.1% (eg “this” and “is”)就会被视为普通的数据项。
GET /_search
"query":
"common":
"body":
"query": "this is bonsai cool",
"cutoff_frequency": 0.001
除了 cutoff_frequency 参数外,还可以通过 minimum_should_match (high_freq, low_freq), low_freq_operator (default “or”) and high_freq_operator (default “or”) 等参数来调整查询方式。
以下案例中通过设置 low_freq_operator 为 and,低频term将会以 must的形式来执行查询。
GET /_search
"query":
"common":
"body":
"query": "nelly the elephant as a cartoon",
"cutoff_frequency": 0.001,
"low_freq_operator": "and"
等价为:
GET /_search
"query":
"bool":
"must": [
"term": "body": "nelly",
"term": "body": "elephant",
"term": "body": "cartoon"
],
"should": [
"term": "body": "the",
"term": "body": "as",
"term": "body": "a"
]
该查询使用一种严格的语法来解析query string,基于这些query string返回查询文档。
其基于操作符,用一种特定的语法来解析和分离指定的query string,例如使用 AND 或者NOT。在返回匹配文档前,该查询会先分析每一个被分离的text。
用户可以通过 query_string 查询来创建复杂的搜索,该搜索不仅可以包含通配符,也可以对多个字段就行查询。该查询使用方式虽然很多,但其使用比较严格,一旦查询语法格式不对就报错。
以下案例将 query_string分为 new york city 和 big apple 2部分,然后再分别将两部分解析为对应的tokens,然后执行查询并返回符合要求匹配文档。
GET /_search
"query":
"query_string" :
"query" : "(new york city) OR (big apple)",
"default_field" : "content"
Query string 有很多语法要求,此处记录一些常见的语法:
"bool":
"must": "match": "fox" ,
"should": "match": "quick brown" ,
"must_not": "match": "news"
基于指定的query string返回相关文档, 该query字符串使用 limited but fault-tolerant 语法解析器。
该查询基于特定的操作符,使用一种简单的语法来解析并分离指定的查询字符串为很多个单独的数据项。然后再独立地分析每一个数据项,最后返回匹配的文档。
该查询比 query_string 限定更强,但当出现无效语法的时候其报错,而是直接忽略掉无效的query字符串。
其常见顶层参数包括:query(必选), fields, default_operator, all_fields, flags 等.
GET /_search
"query":
"simple_query_string" :
"query": "\\"fried eggs\\" +(eggplant | potato) -frittata",
"fields": ["title^5", "body"],
"default_operator": "and"
simple_query_string 查询支持如下操作符: